Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: #233 새로고침 시 zustand 스토어 초기화되는 문제 수정 #263

Merged
merged 7 commits into from
Nov 5, 2024

Conversation

Yoonyesol
Copy link
Contributor

PR Type

What kind of change does this PR introduce?

  • [Fix] 버그를 수정했어요.

Related Issues

What does this PR do?

  • 로그인이 필요한 라우트의 페이지에서 새로고침 발생 시, useEffect 내부에서 리프레시 토큰을 이용해 액세스 토큰 요청하도록 처리
  • 로그인 여부 인증하는 isAuthenticated 영속화 처리 (기존 user-info에 유저 정보와 함께 저장되며, 암호화 관리됨)

View

저장

Other information

원래 계획은 새로고침 하면서 스토어의 setTimeout이 초기화되며 발생하는 문제도 함께 처리하려는 것이었는데, 구현 기간이 늘어지면서 수정 완료된 기능부터 먼저 올리게 되었습니다.🥲
새로고침 에러를 해결하기는 했지만 완성도가 높은 코드는 아니기 때문에 추후 리팩토링을 진행할 예정입니다!
아직 사용되고 있지 않은 isVerified는 인증 시간 관련해서 처리하기 위해 넣어두었습니다. 관련 수정도 이어서 진행하겠습니다.
추가로 앞으로 토큰 관련 해결해야 하는 에러들을 정리해 보면 아래와 같습니다.

  1. 액세스 토큰 재발급 안 될 시 로그아웃이 안 되는 문제 해결 (userInfo 참조 부분에서 문제가 발생하는 듯 합니다)
  2. 대기 상태에서 액세스 토큰 만료 시, 서버에 액세스 토큰 요청하도록 처리
  3. 대기 상태에서 액세스 토큰 만료 시, 리액트 쿼리에서 다시 리패치 보낼 때 401 에러가 뜨는 문제 (팀 관리 쪽부터 살펴볼 생각입니다)
  4. 새로고침 시, 액세스 토큰 만료 시간이 초기화되는 문제
  5. 새로고침 시, 비밀번호 변경 전 이메일 인증 페이지의 인증 시간이 초기화되는 문제

남은 부분도 순차적으로 처리해보도록 하겠습니다!

@Yoonyesol Yoonyesol added 🐞 Bug 버그가 발생했어요 💉 Fix 에러 혹은 버그를 수정했어요 labels Nov 4, 2024
@Yoonyesol Yoonyesol self-assigned this Nov 4, 2024
Copy link

coderabbitai bot commented Nov 4, 2024

Walkthrough

이 PR에서는 여러 컴포넌트의 인증 관련 로직을 간소화하고, 사용자 인터페이스를 개선하는 변경 사항이 포함되어 있습니다. Header 컴포넌트의 로그아웃 버튼 클릭 처리 로직이 수정되었으며, ProfileImageContainer에서 이미지 업로드 처리 방식이 변경되었습니다. 또한, AfterLoginRouteBeforeLoginRoute에서 인증 상태에 따른 라우팅 로직이 개선되었고, useStore의 상태 관리가 강화되었습니다.

Changes

파일 경로 변경 요약
src/components/common/Header.tsx 로그아웃 버튼 클릭 처리 로직 수정, 버튼 텍스트 업데이트.
src/components/user/auth-form/ProfileImageContainer.tsx 이미지 업로드 시 로컬 URL 생성 제거, 에러 처리 로직 유지.
src/mocks/services/authServiceHandler.ts 리프레시 토큰 API 수정, 토큰 처리 로직 변경.
src/routes/AfterLoginRoute.tsx 인증 상태에 따른 자동 토큰 갱신 로직 추가, 에러 처리 및 리디렉션 로직 개선.
src/routes/BeforeLoginRoute.tsx 인증 상태에 따른 라우팅 로직 간소화.
src/stores/useStore.ts Zustand 스토어의 지속성 구성 변경, isAuthenticatedisVerified 추가.

Assessment against linked issues

Objective Addressed Explanation
리프레시 토큰을 이용한 액세스 토큰 요청 (#233)
로그인 여부 인증하는 isAuthenticated 처리 (#233)
액세스 토큰 만료 시간 유지 (#233) 해당 기능이 구현되지 않음.
비밀번호 페이지 변경 전, 이메일 인증 여부(isVerified) 만료 시간 유지 (#233) 해당 기능이 구현되지 않음.

Possibly related PRs

Suggested labels

⚙️ Config

Suggested reviewers

  • Seok93
  • ice-bear98

🐰 변화의 길을 달리며,
로그아웃 버튼이 반짝이네!
인증의 문을 열고 나가,
새로 고침에 기쁨이 넘쳐나!
프로필 이미지도 빛나고,
모두 함께 즐거운 하루 보내요! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (6)
src/routes/BeforeLoginRoute.tsx (1)

6-10: 컴포넌트의 역할을 설명하는 주석 추가를 제안합니다.

이 라우트 가드 컴포넌트의 목적과 동작을 설명하는 JSDoc 주석을 추가하면 좋을 것 같습니다.

다음과 같은 주석 추가를 제안합니다:

+/**
+ * 비로그인 상태에서만 접근 가능한 라우트를 처리하는 컴포넌트
+ * 인증된 사용자는 홈페이지로 리다이렉트됩니다.
+ */
export default function BeforeLoginRoute({ children }: PropsWithChildren) {
src/components/common/Header.tsx (1)

48-48: 인증 상태 확인 로직이 개선되었습니다!

인증 상태 확인을 isAuthenticated 하나로 통일함으로써 코드가 더 명확하고 유지보수하기 쉬워졌습니다. 이는 zustand 스토어의 상태 관리를 단순화하는 좋은 접근 방식입니다.

다만, 향후 다음 사항들을 고려해보시면 좋을 것 같습니다:

  • 로그아웃 시 로컬 스토리지나 세션 스토리지의 데이터도 함께 정리
  • 페이지 새로고침 시에도 일관된 인증 상태를 유지하도록 처리

Also applies to: 50-50

src/stores/useStore.ts (2)

Line range hint 1-144: 리프레시 토큰 구현이 필요합니다.

PR 목표에서 언급된 리프레시 토큰을 사용한 액세스 토큰 갱신 로직이 현재 구현되어 있지 않습니다. 다음 사항들을 고려해주세요:

  1. 리프레시 토큰 저장 및 관리 로직 추가
  2. 액세스 토큰 만료 시 자동 갱신 메커니즘 구현
  3. 리프레시 토큰 만료 처리

리프레시 토큰 관련 구현이 필요하시다면 도움을 드릴 수 있습니다.


Line range hint 39-46: setTimeout 사용에 대한 개선이 필요합니다.

현재 onLoginonVerifyCode에서 사용되는 setTimeout은 페이지 새로고침 시 초기화되어 타이머가 재설정됩니다. 이로 인해 다음과 같은 문제가 발생할 수 있습니다:

  1. 실제 토큰 만료 시간과 클라이언트의 타이머가 불일치
  2. 페이지 새로고침 시 타이머가 초기화되어 잘못된 만료 처리

다음과 같은 개선을 제안드립니다:

  1. 토큰 만료 시간을 저장소에 함께 저장
  2. 페이지 로드 시 저장된 만료 시간을 기준으로 타이머 설정
  3. JWT decode를 통한 실제 토큰 만료 시간 확인

구체적인 구현이 필요하시다면 도움을 드릴 수 있습니다.

Also applies to: 48-54

src/mocks/services/authServiceHandler.ts (2)

Line range hint 211-227: 쿠키를 통한 토큰 처리 방식이 개선되었습니다.

쿠키를 사용하여 리프레시 토큰을 처리하는 방식으로 변경된 것은 보안적으로 좋은 접근입니다. 다만, 쿠키 관련 타입 안전성을 위해 다음과 같은 개선을 제안드립니다.

- const { refreshToken, refreshTokenExpiresAt } = cookies;
+ type AuthCookies = {
+   refreshToken?: string;
+   refreshTokenExpiresAt?: string;
+ };
+ const { refreshToken, refreshTokenExpiresAt } = cookies as AuthCookies;

Line range hint 228-238: 토큰 갱신 로직에 대한 에러 처리 보완이 필요합니다.

토큰 갱신 과정에서 발생할 수 있는 다양한 에러 상황에 대한 처리와 로깅을 추가하면 좋을 것 같습니다.

  const userId = convertTokenToUserId(refreshToken);
- if (!userId) return new HttpResponse(null, { status: 401 });
+ if (!userId) {
+   console.error('리프레시 토큰에서 사용자 ID를 추출할 수 없습니다.');
+   return HttpResponse.json(
+     { message: '유효하지 않은 인증 정보입니다.' },
+     { status: 401 }
+   );
+ }

  const newAccessToken = generateDummyToken(userId);
+ if (!newAccessToken) {
+   console.error('새로운 액세스 토큰 생성에 실패했습니다.');
+   return HttpResponse.json(
+     { message: '토큰 갱신에 실패했습니다.' },
+     { status: 500 }
+   );
+ }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ec90d12 and 9c85267.

📒 Files selected for processing (6)
  • src/components/common/Header.tsx (1 hunks)
  • src/components/user/auth-form/ProfileImageContainer.tsx (0 hunks)
  • src/mocks/services/authServiceHandler.ts (2 hunks)
  • src/routes/AfterLoginRoute.tsx (1 hunks)
  • src/routes/BeforeLoginRoute.tsx (1 hunks)
  • src/stores/useStore.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/user/auth-form/ProfileImageContainer.tsx
🔇 Additional comments (3)
src/routes/BeforeLoginRoute.tsx (1)

6-8: 인증 로직 단순화가 잘 되었습니다!

userInfo 의존성을 제거하고 isAuthenticated 상태만 확인하도록 변경한 것이 좋은 개선입니다. 이는 상태 관리를 더 단순하고 예측 가능하게 만듭니다.

src/stores/useStore.ts (1)

139-140: 상태 지속성 구현이 개선되었습니다.

isAuthenticatedisVerified 상태를 로컬 스토리지에 저장하도록 추가한 것은 페이지 새로고침 시 인증 상태를 유지하는데 도움이 될 것입니다.

src/mocks/services/authServiceHandler.ts (1)

Line range hint 211-238: zustand 스토어와의 연동 검증이 필요합니다.

리프레시 토큰을 통한 인증 상태 유지 구현이 잘 되어있습니다. 하지만 이 구현이 zustand 스토어의 초기화 문제를 완전히 해결하는지 확인이 필요합니다.

✅ Verification successful

토큰 갱신 로직이 zustand 스토어와 올바르게 연동되어 있습니다.

axiosProvider의 구현을 확인한 결과, 리프레시 토큰을 통한 액세스 토큰 갱신 시 zustand 스토어가 적절하게 업데이트되고 있습니다:

  • 토큰 갱신 성공 시 onLogin(newAccessToken)을 통해 스토어 상태가 업데이트됨
  • 갱신 실패 시 onLogout()clearUserInfo()를 통해 스토어가 초기화됨
  • 요청 인터셉터에서 스토어의 최신 accessToken 상태를 사용하여 인증 헤더를 구성함
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# zustand 스토어 관련 파일들을 검색하여 토큰 갱신 로직과의 연동을 확인합니다.
echo "zustand 스토어 파일 검색 중..."
rg -l "useStore" --type ts

echo "토큰 갱신 관련 로직 검색 중..."
rg "refresh.*token" --type ts

Length of output: 746


Script:

#!/bin/bash
# 토큰 갱신과 관련된 zustand 스토어 로직을 더 자세히 검색
echo "스토어 구현 확인"
rg -A 10 "create\(" src/stores/useStore.ts

echo "\n토큰 관련 로직 검색"
rg -A 5 "token" src/stores/useStore.ts

echo "\n리프레시 토큰 사용 부분 검색"
rg -A 5 "refreshToken" src/services/axiosProvider.ts

Length of output: 656


Script:

#!/bin/bash
# axiosProvider에서 토큰 갱신 로직 확인
echo "axiosProvider 전체 내용 확인"
cat src/services/axiosProvider.ts

echo "\n토큰 갱신 API 호출 부분 검색"
rg -B 5 -A 10 "user/refresh" src/services/axiosProvider.ts

echo "\n스토어 업데이트 호출 부분 검색"
rg -B 3 -A 3 "setAccessToken" src/services/axiosProvider.ts

Length of output: 3562

src/routes/AfterLoginRoute.tsx Show resolved Hide resolved
Copy link

coderabbitai bot commented Nov 4, 2024

Walkthrough

이 PR에서는 여러 컴포넌트의 인증 및 이미지 업로드 처리 로직이 수정되었습니다. Header 컴포넌트는 로그아웃 버튼의 클릭 핸들링을 단순화하고, 텍스트 표시를 변경했습니다. ProfileImageContainer는 이미지 업로드 후 로컬 URL 생성을 제거하여 업로드 프로세스를 간소화했습니다. authServiceHandler는 액세스 토큰 갱신 로직을 수정하여 쿠키를 통해 리프레시 토큰을 처리하도록 변경했습니다. AfterLoginRouteBeforeLoginRoute는 인증 로직을 간소화하고, useStore는 인증 상태를 로컬 스토리지에 저장하도록 개선되었습니다.

Changes

파일 경로 변경 요약
src/components/common/Header.tsx 로그아웃 버튼 클릭 핸들링 단순화 및 표시 텍스트 변경.
src/components/user/auth-form/ProfileImageContainer.tsx 이미지 업로드 후 로컬 URL 생성 제거, 오류 처리 유지.
src/mocks/services/authServiceHandler.ts 액세스 토큰 갱신 로직 수정, 쿠키를 통해 리프레시 토큰 처리.
src/routes/AfterLoginRoute.tsx 토큰 갱신을 위한 useEffect 추가 및 에러 처리 로직 개선.
src/routes/BeforeLoginRoute.tsx 인증 체크 로직 간소화, userInfo 객체 제거.
src/stores/useStore.ts 인증 상태(isAuthenticated, isVerified)를 로컬 스토리지에 저장하도록 persist 기능 개선.

Assessment against linked issues

Objective Addressed Explanation
리프레시 토큰을 이용한 액세스 토큰 요청 (#233)
로그인 여부 인증하는 isAuthenticated 처리 (#233)

Possibly related PRs

Suggested labels

⚙️ Config

Suggested reviewers

  • Seok93
  • ice-bear98

🐰 변화의 바람이 불어와
로그아웃 버튼이 반짝이네,
이미지 업로드도 간편해,
스토어는 안전하게 지켜줘,
새로운 길로 나아가자,
함께하는 우리, 더 밝은 미래로! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (4)
src/components/common/Header.tsx (1)

Line range hint 15-28: 로그아웃 중 로딩 상태 처리 개선이 필요합니다.

현재 로그아웃 처리 중에는 사용자에게 진행 상태가 표시되지 않습니다. 로그아웃이 완료되기 전에 버튼이 다시 클릭되면 문제가 발생할 수 있습니다.

다음과 같이 로딩 상태를 추가하는 것을 제안합니다:

+  const [isLoggingOut, setIsLoggingOut] = useState(false);

   const handleLogout = async () => {
+    if (isLoggingOut) return;
     try {
+      setIsLoggingOut(true);
       await logout();
       onLogout();
       clearUserInfo();
       navigate('/signin', { replace: true });
       setTimeout(() => {
         toastSuccess('로그아웃이 완료되었습니다.');
       }, 100);
     } catch (error) {
       console.error('로그아웃 도중 에러가 발생했습니다.');
+    } finally {
+      setIsLoggingOut(false);
     }
   };

그리고 버튼에 로딩 상태를 표시:

   <button
     type="button"
-    className="ml-10 h-20 rounded-md bg-white px-4 tracking-tight hover:brightness-90"
+    className={`ml-10 h-20 rounded-md px-4 tracking-tight ${
+      isLoggingOut ? 'bg-gray-300 cursor-not-allowed' : 'bg-white hover:brightness-90'
+    }`}
     onClick={isAuthenticated ? handleLogout : () => navigate('/signin')}
+    disabled={isLoggingOut}
   >
-    {isAuthenticated ? 'Logout' : 'Login'}
+    {isAuthenticated ? (isLoggingOut ? '로그아웃 중...' : 'Logout') : 'Login'}
   </button>
src/mocks/services/authServiceHandler.ts (2)

Line range hint 211-238: 리프레시 토큰 처리 로직이 개선되었습니다.

쿠키 기반의 리프레시 토큰 처리로 변경된 것이 보안적으로 더 안전해 보입니다. 다만 몇 가지 개선사항을 제안드립니다:

  1. 리프레시 토큰 검증 시 XSS 공격 방지를 위해 httpOnly 플래그 추가를 고려해주세요.
  2. CSRF 공격 방지를 위해 추가적인 토큰 검증 메커니즘 도입을 검토해주세요.

다음과 같이 쿠키 설정을 보완하는 것을 제안드립니다:

  return new HttpResponse(null, {
    status: 200,
    headers: {
      Authorization: `Bearer ${newAccessToken}`,
+     'Set-Cookie': [
+       `refreshToken=${refreshToken}; HttpOnly; SameSite=Strict; Secure; Path=/; Expires=${refreshTokenExpiresAt}`,
+       `refreshTokenExpiresAt=${refreshTokenExpiresAt}; HttpOnly; SameSite=Strict; Secure; Path=/; Expires=${refreshTokenExpiresAt}`
+     ].join(', '),
    },
  });

Line range hint 228-232: 에러 처리가 개선되어야 합니다.

userId가 없는 경우에 대한 에러 메시지가 누락되어 있습니다. 클라이언트에게 더 명확한 에러 메시지를 제공하는 것이 좋겠습니다.

다음과 같이 수정하는 것을 제안드립니다:

  const userId = convertTokenToUserId(refreshToken);
- if (!userId) return new HttpResponse(null, { status: 401 });
+ if (!userId) return HttpResponse.json({ message: '유효하지 않은 토큰입니다.' }, { status: 401 });
src/routes/AfterLoginRoute.tsx (1)

24-28: setTimeout 사용으로 인한 사용자 경험 개선 제안

토큰 갱신 실패 시 2초 지연 후 로그아웃 및 리디렉션을 수행하고 있습니다. 지연 시간 없이 즉시 로그아웃 및 리디렉션을 수행하면 사용자 경험을 향상시킬 수 있습니다.

수정 제안:

-        setTimeout(() => {
             onLogout();
             clearUserInfo();
             navigate('/signin', { replace: true });
-        }, 2000);
+        onLogout();
+        clearUserInfo();
+        navigate('/signin', { replace: true });
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ec90d12 and 9c85267.

📒 Files selected for processing (6)
  • src/components/common/Header.tsx (1 hunks)
  • src/components/user/auth-form/ProfileImageContainer.tsx (0 hunks)
  • src/mocks/services/authServiceHandler.ts (2 hunks)
  • src/routes/AfterLoginRoute.tsx (1 hunks)
  • src/routes/BeforeLoginRoute.tsx (1 hunks)
  • src/stores/useStore.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/user/auth-form/ProfileImageContainer.tsx
🔇 Additional comments (6)
src/routes/BeforeLoginRoute.tsx (2)

6-6: 스토어 상태 관리 단순화가 잘 이루어졌습니다.

userInfo 객체를 제거하고 isAuthenticated 상태만 사용하도록 단순화한 것이 좋은 변경사항입니다. 이는 zustand 스토어의 초기화 문제를 해결하는데 도움이 될 것입니다.


8-8: 인증 상태 검증 로직 확인이 필요합니다.

userInfo.userId 체크를 제거하고 isAuthenticated 만으로 인증을 확인하는 것이 보안상 충분한지 검증이 필요합니다.

다음 스크립트를 실행하여 다른 인증 관련 컴포넌트들의 구현을 확인해보세요:

✅ Verification successful

Let me gather more information with corrected commands.


Let me gather more information about the authentication implementation.


Let me try one more search with corrected patterns.


Let me try one final search with fixed regex patterns.


isAuthenticated 상태만으로도 충분한 인증 검증이 가능합니다.

코드베이스 분석 결과, 다음과 같은 이유로 isAuthenticated 상태만으로 인증 검증이 안전합니다:

  • isAuthenticated는 유효한 액세스 토큰이 있을 때만 true로 설정되며, 토큰 만료 시 자동으로 false로 변경됩니다.
  • 인증 상태는 암호화되어 저장되고 있으며(encrypt/decrypt), 토큰 갱신 실패 시 자동으로 로그아웃됩니다.
  • userInfo는 인증 상태와 독립적으로 관리되는 부가 정보이므로, 인증 검증에 반드시 필요하지 않습니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 다른 인증 관련 컴포넌트들의 구현 확인

# Test: 인증 관련 로직이 있는 파일들 검색
echo "인증 관련 컴포넌트 검색 결과:"
rg -l "isAuthenticated|userInfo" --type ts --type tsx

# Test: useStore 훅의 인증 관련 로직 검색
echo "\nuseStore 훅의 인증 관련 로직:"
ast-grep --pattern 'const useStore = create<Store>($_)'

Length of output: 243


Script:

#!/bin/bash
# 인증 관련 파일 및 로직 검색

# TypeScript/React 파일에서 인증 관련 코드 검색
echo "인증 관련 파일 검색:"
rg -l "isAuthenticated|userInfo" --type typescript --type-add 'typescript:*.{ts,tsx}'

# useStore 구현 검색
echo "\n인증 상태 관리 로직:"
rg -A 10 "isAuthenticated.*=.*{" --type typescript --type-add 'typescript:*.{ts,tsx}'

# 인증 관련 라우트 컴포넌트 검색
echo "\n인증 관련 라우트 컴포넌트:"
rg -A 5 "Navigate.*to.*replace" --type typescript --type-add 'typescript:*.{ts,tsx}'

Length of output: 2562


Script:

#!/bin/bash
# 인증 관련 상세 구현 검색

# useStore의 인증 상태 관리 로직 검색
echo "인증 상태 관리 스토어 구현:"
rg -A 15 "interface Store {" --type typescript --type-add 'typescript:*.{ts,tsx}' src/stores/useStore.ts

# 인증 서비스 로직 검색
echo "\n인증 서비스 구현:"
rg -A 10 "export const userService" --type typescript --type-add 'typescript:*.{ts,tsx}' src/services/userService.ts

# AfterLoginRoute 구현 검색
echo "\nAfterLoginRoute 구현:"
rg -A 10 "export.*AfterLoginRoute" --type typescript --type-add 'typescript:*.{ts,tsx}' src/routes/AfterLoginRoute.tsx

Length of output: 1013


Script:

#!/bin/bash
# 인증 관련 상세 구현 검색

# Store 인터페이스 검색
echo "Store 인터페이스 정의:"
rg -A 10 "type Store = {" --type typescript --type-add 'typescript:*.{ts,tsx}' src/stores/useStore.ts

# 인증 상태 초기화 로직 검색
echo "\n인증 상태 초기화 로직:"
rg -B 5 -A 10 "const initialState = {" --type typescript --type-add 'typescript:*.{ts,tsx}' src/stores/useStore.ts

# 로그인/로그아웃 핸들러 검색
echo "\n로그인/로그아웃 핸들러:"
rg -A 10 "const onLogin = " --type typescript --type-add 'typescript:*.{ts,tsx}' src/stores/useStore.ts

Length of output: 649


Script:

#!/bin/bash
# 인증 관련 상세 구현 검색

# Store 타입과 상태 관리 로직 전체 확인
echo "인증 상태 관리 파일 내용:"
cat src/stores/useStore.ts

# 인증 서비스 구현 확인
echo "\n인증 서비스 구현:"
cat src/services/userService.ts

# 토큰 관리 로직 확인
echo "\n토큰 관리 관련 코드:"
rg "getAccessToken|setAccessToken|clearAccessToken" --type typescript --type-add 'typescript:*.{ts,tsx}'

Length of output: 6872

src/components/common/Header.tsx (1)

48-50: 인증 로직이 단순화되었습니다만, 검증이 필요합니다.

이전 코드에서 userInfoData.userId 체크를 제거한 것이 안전한지 확인이 필요합니다.

다음 스크립트로 userId 사용 패턴을 확인해보겠습니다:

✅ Verification successful

인증 로직 단순화가 안전하게 이루어졌습니다.

코드베이스 분석 결과, userId 체크를 제거하고 isAuthenticated만 사용하는 것이 적절합니다:

  • isAuthenticated는 zustand store에서 전역 인증 상태를 관리하는 단일 소스로 사용됩니다
  • BeforeLoginRouteAfterLoginRouteisAuthenticated만 사용하여 라우팅을 처리합니다
  • userId는 주로 API 호출이나 데이터 조회용으로만 사용되며, 인증 상태 확인에는 사용되지 않습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: userId 사용 패턴 분석
# 예상 결과: BeforeLoginRoute나 다른 인증 관련 컴포넌트에서 userId 체크가 제거되었는지 확인

# userId를 체크하는 다른 컴포넌트 검색
rg "userInfo.*userId" --type ts --type tsx

Length of output: 72


Script:

#!/bin/bash
# Let's try different approaches to find userId usage patterns

# Search for userId in TypeScript files
rg "userId" --type ts

# Search for userInfo in TypeScript files
rg "userInfo" --type ts

# Search for authentication related patterns
rg "isAuthenticated" --type ts

# Look for store usage patterns
ast-grep --pattern 'useStore($$$)'

Length of output: 43402

src/stores/useStore.ts (1)

139-140: 상태 지속성 구현이 적절합니다.

isAuthenticatedisVerified 상태를 로컬 스토리지에 저장하도록 추가한 것이 페이지 새로고침 시 발생하는 문제를 해결하는데 적절한 접근 방식입니다.

하지만 setTimeout으로 설정된 토큰 만료 시간이 페이지 새로고침 시 초기화되는 문제가 여전히 존재할 수 있습니다.

✅ Verification successful

Based on the shell script results, I can now generate the final response since I have found all the relevant token expiration handling in the codebase.

토큰 만료 처리가 적절히 구현되어 있습니다.

useStore.ts에서 isAuthenticatedisVerified 상태의 지속성 구현이 다음과 같은 이유로 안전합니다:

  • AUTH_SETTINGS.ACCESS_TOKEN_EXPIRATIONAUTH_SETTINGS.VERIFIED_EXPIRATION 기반으로 토큰 만료가 정확히 처리됨
  • 페이지 새로고침과 관계없이 setTimeout이 store 초기화 시점에 설정되어 일관성 있게 동작
  • 토큰 만료 시 자동으로 인증 상태가 해제되도록 구현됨
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if there are any other places in the codebase handling token expiration
# that might need to be synchronized with this implementation

# Search for setTimeout usage related to token expiration
rg -A 5 "setTimeout.*token|expir"

# Search for token expiration handling in other files
ast-grep --pattern 'setTimeout($$$)'

Length of output: 9555

src/mocks/services/authServiceHandler.ts (1)

Line range hint 211-238: 토큰 갱신 로직 검증이 필요합니다.

리프레시 토큰을 통한 액세스 토큰 갱신 시, 기존 액세스 토큰의 무효화 처리가 필요할 수 있습니다. 또한 여러 디바이스에서의 동시 접속 시나리오에 대한 처리도 고려해야 합니다.

다음 스크립트로 토큰 갱신 관련 코드를 검증해보겠습니다:

✅ Verification successful

토큰 갱신 로직이 적절하게 구현되어 있습니다.

현재 구현된 토큰 갱신 로직은 다음과 같은 보안 조치를 포함하고 있습니다:

  • 리프레시 토큰의 유효성 검증 (refreshToken === cookieRefreshToken)
  • 리프레시 토큰의 만료 시간 검증
  • 새로운 액세스 토큰 발급 시 사용자 ID 검증

여러 디바이스 접속 시나리오에 대해서는 현재 구현에서 각 디바이스별로 독립적인 리프레시 토큰을 발급받아 사용하므로, 추가적인 처리가 필요하지 않습니다. 기존 액세스 토큰은 짧은 만료 시간으로 인해 자동으로 무효화되므로, 별도의 블랙리스트 처리가 불필요합니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 토큰 갱신 관련 코드 검색
# 토큰 무효화 또는 블랙리스트 관련 코드 확인
rg -i "token.*invalid|blacklist|revoke" 

# 여러 디바이스 접속 처리 관련 코드 확인
rg -i "device.*token|concurrent.*session"

Length of output: 276


Script:

#!/bin/bash
# 토큰 관련 전체 로직 검색
rg -A 5 -B 5 "token" --type ts

# 인증 관련 서비스 파일 내용 확인
fd -e ts "auth.*service" --exec cat {}

# 토큰 생성 및 검증 관련 유틸리티 함수 검색
fd -e ts "token|auth.*util" --exec cat {}

Length of output: 24986

src/routes/AfterLoginRoute.tsx (1)

20-20: AccessToken 파싱 로직 확인 필요

onLogin(newAccessToken.split(' ')[1]);에서 액세스 토큰을 파싱하고 있습니다. newAccessToken의 형식이 항상 "Bearer 토큰값"인지 확인하여, split 사용 시 오류가 발생하지 않도록 검증이 필요합니다. 예상치 못한 형식의 토큰에 대비하여 예외 처리를 추가하는 것을 권장합니다.

src/routes/AfterLoginRoute.tsx Show resolved Hide resolved
Copy link
Contributor

@Seok93 Seok93 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 저번에 임시적으로 해결하려고 넣어두신 uersId도 제거되었군요ㅎㅎ 나머지 작업도 잘부탁드립니다😄

@Yoonyesol
Copy link
Contributor Author

@Seok93 리뷰 감사합니다!

@Yoonyesol Yoonyesol merged commit aecc8cf into develop Nov 5, 2024
@Yoonyesol Yoonyesol deleted the feature/#233-auth-persist branch November 5, 2024 14:22
Seok93 added a commit that referenced this pull request Dec 8, 2024
* Config: #3 누락된 환경 설정 내용 추가

1. react query eslint 추가
2. 파일 시스템 구조 추가 : stores, types

* Rename: common 디렉토리를 components 디렉토리 하위로 이동

1. common 디렉토리 이동
2. common 절대 경로 설정 삭제 (vite, ts)

* Config: #10 routes 절대 경로 추가

* Design: #10 router 설정에 필요한 페이지 컴포넌트 추가

* Design: #10 router 설정에 필요한 layout 컴포넌트 골격 추가

* Feat: #10 로그인 전, 후에만 접근 가능하도록 제한하는 Router 추가

* Feat: #10 Router 설정 및 추가

* Config: #13 tailwind 전역 변수 추가

* Config: #13 공용 변수 정의 추가

* Config: #13 tailwind 속성명 규칙화

* Config: #13 tailwind 속성명 규칙화

* Config: #13 tailwind 속성 확장

* Config: #13 크기 자율성을 위해 contents size 설정 삭제

* Config: tailwind 유틸리티 클래스 자동 정렬 기능 추가

* Feat: #16 공용 Header 컴포넌트 UI 작성

* Fix: #16 tailwind CSS 중복된 속성명 구별을 위한 네이밍 변경

* UI: #16 공용 Header CSS 설정 추가

* Feat: #9 NotFound 페이지 작성

* UI: #21 Default Layout의 contents 부분의 크기 제한 설정

* UI: #21 Project Layout UI 작성

* Config: #21 tailwind 속성/스타일 추가

* UI: #21 ProjectLayout의 Sidebar를 공용 Sidebar로 추출

* Rename: project → ProjectType으로  파일명 수정

* Rename: #21 layout 구분을 위하여 page 디렉터리 추가 및 관련 파일 이동

* Feat: #24 React Portal Modal Layout UI 작업

* config: #24 tailwindcss 유틸리티 클래스 확장

* config: #24 React Hook Form 편의 사용을 위한 일부 eslint 제약 완화

* Feat: #24 객체 동결 기능과 공통 validation 기능 추가

* Feat: #24 상태 추가 모달 UI 작업과 Form Validation 추가

* Formatting: #24 타입명 수정

* UI: #24 상태 추가 모달 적용

* fix: #24 falsy 값 출력 방지를 위한 간단한 로직 변경

* Docs: github commit convention 변경으로 인한 PR 템플릿 수정

* Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치

* Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의

* Config: #33 ESLint 설정 완화

* Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가

* UI: #33 ProjectLayout 수정

* Formmating: #33 deepClone의 매개변수명 변경

* Feat: #33 특정 프로젝트 칸반 보드 UI 작성 & 할일 목록 DnD 기능 추가 (#36)

* Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치

* Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의

* Config: #33 ESLint 설정 완화

* Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가

* UI: #33 ProjectLayout 수정

* Formmating: #33 deepClone의 매개변수명 변경

* Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화

* Refactor: #33 DnD 순서 변경 함수 통합 & 가독성을 위한 조건문 변수화 (#38)

* Config: #33 react-beautiful-dnd를 계승한 @hello-pangea/dnd 설치

* Chore: #33 mock 데이터 추가 및 관련 Types 추가 정의

* Config: #33 ESLint 설정 완화

* Feat: #33 칸반 보드 UI 작성 & 칸반 보드 할일 드래그 앤 드롭 기능 추가

* UI: #33 ProjectLayout 수정

* Formmating: #33 deepClone의 매개변수명 변경

* Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화

* Formatting: #33 ERD 할일 테이블 이름(Task)로 통합(todo → task)

* Formatting: #33 Task 이름 단수/복수 구별

* Formatting: #33 state의 tasks와 데이터구조의 tasks 이름 구별 (for no-shadow)

* Formatting: #33  기존에 사용하던 Todo라는 이름을 ERD 할일 테이블 이름인 Task으로 통합 (todo → task) (#39)

* Refactor: #33 DnD 순서변경 함수 통합 & 가독성을 위한 조건식 변수화

* Formatting: #33 ERD 할일 테이블 이름(Task)로 통합(todo → task)

* Formatting: #33 Task 이름 단수/복수 구별

* Formatting: #33 state의 tasks와 데이터구조의 tasks 이름 구별 (for no-shadow)

* Feat: #33 특정 프로젝트 상태 목록 수평 DnD 기능 추가 (#40)

* Feat: #33 특정 프로젝트 상태 목록 수평 DnD 기능 추가

* Refactor: #33 컴포넌트 분리 / types, constants 등 관심사 분리 (#41)

* Rename: Validator 확장자 변경 (tsx→ts)

* Refactor: #33 컴포넌트 분리 / types & constants 등 관심사 분리

* Fix: #33 React Key Props 에러 재설정

* Refoctor: #33 할일 변경 함수 구조분해할당 삭제

* Rename: #33 ERD 프로젝트 상태 테이블 이름으로 통합 (TaskStatus → ProjectStatus) (#42)

* Rename: #33 ERD 프로젝트 상태 테이블 이름으로 통합 (TaskStatus → ProjectStatus)

* Refactor: #44 상태 모달 생성/수정 폼 공유를 위한 리팩토링 (#46)

* Fix: #44 mock 데이터 에러 해결

* Refactor: #44 상태 모달 생성/수정 폼 공유를 위한 리팩토링

* Chore: #33 기능명세서 변경으로 인한 색상 추가 기능 제거

* Formatting: #44 컴포넌트 Props 이름 변경

* Feat: #5 회원가입 페이지 생성 및 Validation 작성 (#37)

* Feat: #5 회원가입 페이지 생성 및 마크업, CSS 스타일링

* Feat: #5 회원가입 입력 데이터 유효성 검사 기능 추가

* Design: #5 회원가입 페이지 스타일링 변경 및 프로필 이미지 설정 , 삭제 기능 추가

* Feat: #27 로그인 페이지 작성

* design: 수정된 회원가입 폼으로 UI 수정, 비밀번호 보이기 및 숨김 기능 추가

* Design: #27 수정된 로그인 폼으로 UI 수정

* Formatting: #5 유저관련폼 중복 처리 및 회원가입 폼 변수명 수정

* refactor: 공통 유효성 인증 input 컴포넌트 적용 및 회원가입 폼 디자인 수정사항 반영

* feat: 링크 갯수 제한 기능 추가

* UI: #5 로직에 따른 아이콘 등록 수정

* UI: #5 버튼 라운드 값 수정

* UI: #5 리뷰 반영 디자인 수정

* Chore: 정규식 수정 및 eslint 수정

* Refactor: #5 회원가입 폼에서 유효성 검증 규칙 분리

* Formatting: #5 타입 변수명 컨벤션 지정에 따른 타입 변수명 변경

* Feat: #5 비밀번호 정규식에 특수기호 추가

* UI: #5 필수 입력필드 체크 UI 수정

* UI: #5 input 필드에 sup 태그 적용 및 flex-grow -> grow 수정, form의 noValidate 속성 제거

* Feat: #27 로그인 페이지 생성 및 Validation 작성 (#43)

* Feat: #5 회원가입 페이지 생성 및 마크업, CSS 스타일링

* Feat: #5 회원가입 입력 데이터 유효성 검사 기능 추가

* Design: #5 회원가입 페이지 스타일링 변경 및 프로필 이미지 설정 , 삭제 기능 추가

* Feat: #27 로그인 페이지 작성

* design: 수정된 회원가입 폼으로 UI 수정, 비밀번호 보이기 및 숨김 기능 추가

* Design: #27 수정된 로그인 폼으로 UI 수정

* Formatting: #5 유저관련폼 중복 처리 및 회원가입 폼 변수명 수정

* refactor: 공통 유효성 인증 input 컴포넌트 적용 및 회원가입 폼 디자인 수정사항 반영

* feat: 링크 갯수 제한 기능 추가

* UI: #5 로직에 따른 아이콘 등록 수정

* UI: #5 버튼 라운드 값 수정

* UI: #5 리뷰 반영 디자인 수정

* Chore: 정규식 수정 및 eslint 수정

* Refactor: #5 회원가입 폼에서 유효성 검증 규칙 분리

* Refactor: #27 ValidationInput 컴포넌트를 이용한 리팩토링 및 전반적인 UI 수정

* UI: #27 소셜 로그인 버튼 UI 수정

* Feat: #44 칸반보드 프로젝트 상태 수정 모달 작성 (#47)

* Feat: #44 칸반보드 상태 수정 모달 작성

* Feat: #44 useModal 커스텀훅 추가

* Fix: #49 로그인 페이지 import 관련 버그 수정 (#50)

* Feat: #52 알림을 위한 토스트 메시지 추가 (#53)

* Config: #52 react-toastify 라이브러리 추가

* UI: #52 ToastLayout 추가 및 설정

* Feat: #52 토스트 메시지를 위한 커스텀훅 작성(useToast)

* Chore: #52 불필요한 타입 제거 및 멀티 라인 명시적 그룹화

* UI: #52 토스트 메세지별 border-bottom-color 설정

* UI: #55 스크롤바 UI 변경 (#56)

* Feat: #51 특정 프로젝트 관리 페이지: 캘린더 UI 작성 (#54)

* Config: #51 react-big-calendar & luxon 라이브러리 추가

* Chore: #51 TaskWithStatus 타입 세분화 및 변경사항 수정

* fix: #51 TaskWithStatus 타입 변경후 누락된 부분 추가

* Chore: #51 더미데이터 추가 정의 & ProjectType 변경

* UI: #51 Stacking Context 수정 & UI 간격 수정

* Feat: #51 Calendar 기본 UI 작성

* Fix: #51 onNavigate 에러 해결

* UI: #51 CalendarToolbar UI 개선

* UI: #51 DateHeader 커스텀 디자인 추가

* UI: #51 CustomEvent → CustomEventWrapper 변경후 UI 추가 정의

* UI: #51 Calendar Custom Component 적용

* UI: #57 프로젝트 레이아웃 UI 변경 (#59)

* Feat: #51 특정 프로젝트 관리 페이지: 프로젝트 기간 설정 유무에 따른  날짜 스타일 처리 (#60)

* Feat: #51 PageLayout의 Outlet Context 설정 & 커스텀훅 추가

* Feat: #51 프로젝트 기간 이외의 날짜 disable 스타일 추가

* UI: #51 react-big-calendar CSS 오버라이딩

* Chore: 불필요한 주석 삭제

* Fix: #51 프로젝트 기간이 없는 경우 처리 추가

* Chore: #51 mock 데이터 수정

* Feat: #35 ID/PW 찾기 페이지 UI 작성 및 Validation 체크 (#58)

* Feat: #35 ID 찾기 페이지 마크업 및 스타일링

* Feat: #35 PW 찾기 페이지 마크업 및 스타일링

* Refactor: #35 로그인, ID, PW 찾기 페이지 중복 추출 컴포넌트 제작 및 적용

* Refactor: #35 인증 페이지 전반적으로 겹치는 스타일링 분리

* Formatting: #35 로그인 페이지의 email 필드를 id 필드로 변경

* UI: #35 공용 버튼에서 그림자 제거

* UI: #35 로그인, ID/PW 찾기 페이지 리뷰 반영 디자인 수정

* Feat: #35 닉네임 validation 추가 및 기존 validation, 정규식 관련 코드 수정

* Refactor: #35 폼 하단 공통 링크 컴포넌트 중복제거 리팩토링

* Refactor: #35 회원가입 페이지 비밀번호 확인 validate 분리 및 공용Form 컴포넌트 props 타입 수정

* Feat: 할일 등록 모달 토대 UI 작성 & 일정명, 날짜 설정 기능 추가 (#67)

* UI: #63 중복값 체크 input을 공용 컴포넌트로 추출

* UI: #63 모달 레이아웃 스타일 수정

* UI: #63 할일 등록 모달 토대 UI 작성

* Feat: #63 할일 일정명과 기간 설정 로직 추가

* Formatting: #63 오탈자 수정 (ModaFormButton → ModalFormButton)

* Config: Code Spell Check 확장앱 추가

* UI: #63 ToggleButton을 공통 컴포넌트로 분리

* UI: #63 ToggleButton 스타일 수정

* UI: #62 모든 프로젝트 관리 페이지 중 팀/프로젝트가 없는 경우 UI 작성 (#64)

* UI: #62 모든 프로젝트 관리 페이지중 팀/프로젝트가 없는 경우 UI 작성

* Feat: #62 teamid 예외처리 추가 및 ListSidebar button props 변경

* Formatting: #62 ListSidebar props 이름 변경

* Comment: #62 불필요한 주석 삭제

* Formatting: #62 오탈자 수정

* Formatting: #62 import 경로 정리

* Feat: #63 할일 등록 모달 상태 설정 기능 추가 (#70)

* Refactor: #63 useStatusQuery 검색 방식 변경에 따른 구조 변경

* Fix: #63 prettier 재반영

* Feat: #63 할일 상태 선택 기능 추가

* Feat: #65 회원가입 폼 UI 수정 및 관련 로직 수정 (#66)

* Feat: #35 ID 찾기 페이지 마크업 및 스타일링

* Feat: #35 PW 찾기 페이지 마크업 및 스타일링

* Refactor: #35 로그인, ID, PW 찾기 페이지 중복 추출 컴포넌트 제작 및 적용

* Refactor: #35 인증 페이지 전반적으로 겹치는 스타일링 분리

* Formatting: #35 로그인 페이지의 email 필드를 id 필드로 변경

* UI: #35 공용 버튼에서 그림자 제거

* UI: #35 로그인, ID/PW 찾기 페이지 리뷰 반영 디자인 수정

* Feat: #35 닉네임 validation 추가 및 기존 validation, 정규식 관련 코드 수정

* Refactor: #35 폼 하단 공통 링크 컴포넌트 중복제거 리팩토링

* Refactor: #35 회원가입 페이지 비밀번호 확인 validate 분리 및 공용Form 컴포넌트 props 타입 수정

* UI: #65 변경된 회원가입 로직에 따라 UI 변경 및 폼 전송 로직 수정

* Feat: #65 링크 추가 key값 부여방식과 링크 삭제 로직 변경

* Feat: #65 회원가입 이메일 인증 초시계 구현

* Feat: #65 이미지 전송 로직 추가

* Feat: #65 회원가입 form 전송 로직 수정 및 회원가입 API 적용

* Fix: #65 이미지 제한 크기 수정

* Fix: #65 기능명세서에 따라 등록 가능 링크의 개수를 수정

* Fix: #65 병합 컨플릭트 해결

* Refactor: #65 Timer 컴포넌트 리뷰 반영 리팩토링

* Refactor: #65 이미지파일 관련 상수 분리 및 early return 패턴과 삼항연산자 적용

* Feat: #65 안내메시지 노출 방식을 toast 메시지로 변경 및 단위 상수분리

* Refactor: #65 회원가입 폼의 인증요청과 회원가입 버튼 분리 및 인증과 폼제출 로직 분리

* Feat: #65 form 전송 함수의 이미지 전송 api, 폼 전송 api 에러처리 로직 수정

* Refactor: #65 유저 설정값 상수화 및 정규표현식 수정

* Fix: #65 정규식 관련 코드 수정

* Comment: #65 회원가입 로직 관련 주석 추가

* Feature: #65 이미지 상수를 명시적으로 변경 및 파일사이즈 string 변환 함수 생성 적용

* Refactor: #65 유저 인증 폼 관련 유효성 검증 상수 분리

* Refactor: #65 회원가입 폼 submit 버튼 변경을 삼항연산자로 처리

* UI: #62 모든 프로젝트 관리 페이지 중 팀/프로젝트가 있는 경우 UI 작성 (#71)

* UI: #62 모든 프로젝트 관리 페이지 팀/프로젝트 있는 경우 UI 작성

* Feat: #62 버튼 클릭 시 모달 페이지 열리도록 기능 추가

* UI: 버튼 hover시 밝기 조절추가

* UI: #69 유저 정보 설정 페이지 UI 구현 (#73)

* Feat: #69 유저 설정 페이지 기본 라우트 세팅

* Feat: #69 사이드 메뉴 및 공통 레이아웃 구현

* Feat: #69 유저 설정 이메일 인증 페이지 UI 구현

* Feat: #69 비밀번호 변경 페이지 UI 구현

* UI: #69 스타일링 코드 정리

* Fix: #69 유저 설정 페이지 라우팅 관련 코드 수정

* Refactor: #69 타입명 변경 및 타입 정의 방식 수정

* UI: #69 SettingLayout 라우트별 스타일 분리 코드 제거

* Feat: #69 헤더 컴포넌트 user세팅 경로 수정

* Feat: #63 할일 추가 모달 수행자 검색 기능 구현 (#75)

* Feat: #63 Axios 기본 환경 설정 & Axios Instance 생성 Provider 정의

* Feat: #63 useAxios 커스텀훅 정의 / AbortController signal 처리 추가

* Chore: #63 mock 데이터 수정

* Feat: #63 프로젝트 유저 검색 API 모킹 추가

* Chore: #63 Mock Handler 불필요한 코드 제거

* Feat: #63 useAxios 트리거 형태로 변경 & API 함수 구조 변경

* Feat: API Mock handler 처리 수정 & Mock 데이터 수정

* Feat: #63 useAxios 커스텀훅에 clearData 기능 추가

* Feat: #63 MSW handler 구조 변경

* Feat: #63 userService & teamService 기본 골격 추가

* Remove: #63 파일 구조 유지를 위한 더미 파일 삭제

* Feat: #63 수행자 검색 기능 개발

* Feat: #63 UserType 수정 & Mock 데이터 수정

* Config: #76 VSCode 확장앱 추가 (vitest, JSDoc Generator etc) (#77)

* Feat: #63 수행자 목록 UI 추가 & 수행자 추가/삭제 기능 구현 (#79)

* Feat: #63 수행자 목록 UI 작업 & 추가/삭제 기능

* UI: #63 할일 추가 / 상태 추가 버튼 UI 스타일 변경

* Feat: #63 수행저 권한을 아이콘으로 변경 & 아이콘 툴팁 설명 추가 (#81)

* Fix: #82 UpdateModalTeam props 오류 수정 (#83)

* UI: #72 유저 정보 설정 페이지 팀 설정 UI 구현 (#74)

* UI: #72 유저 정보 설정 페이지 팀 설정 UI 구현

* Feat: #72 팀 초대 및 가입 상태를 처리하는 API Handler 추가 & 팀 설정 페이지 UI변경

* UI: #72 팀 head UI 추가 & style 변경

* Formatting: #72 TeamSettingPage 시맨틱 태그로 변경

* Feat: #63 마크다운 기능 추가 (#84)

* Config: #63 react-markdown, react-gfm, rehype-raw, react-syntax-hightlight 추가

* Feat: #63 마크다운 기능 추가 CommonMarkdown, GFM, Rehype-raw for HTML)

* UI: #69 유저 정보 설정 페이지 UI 구현  (#78)

* Feat: #69 유저 개인정보 설정 페이지 구현

* Refactor: #69 UserSettingPage에서 이미지, 링크 관련 코드를 컴포넌트로 분리

* Refactor: #69 SignUpPage에서 이미지, 링크 관련 코드를 컴포넌트로 분리

* Refactor: #69 이미지 전송을 위해 폼에서 이미지를 처리할 수 있도록 코드 리팩토링

* Refactor: #69 UserAuthenticatePage의 이메일 인증 로직을 훅으로 분리 및 인증 submit 버튼을 컴포넌트로 분리

* Refactor: #69 SignUpPage의 이메일 인증 로직, 인증 submit 버튼 분리

* Refactor: #69 인증코드 확인 로직 분리

* Rename: #69 유저설정 페이지 관련 컴포넌트 이름 수정 및 auth-form 폴더 구조 수정

* Feat: #69 인증버튼 라벨 props 추가

* Fix: #69 conflict 에러 해결

* UI: #69 전체적인 코드 태그 수정 및 디자인 코드 수정, 로고 수정

* Refactor: #69 인증번호관리 훅에서 타이머 visible 코드 삭제 및 타이머 visible 로직 수정

* UI: #69 일부 코드 태그 수정 및 디자인 코드 수정

* UI: #69 링크 컴포넌트 버튼 내부 아이콘 크기 조절

* Comment: #69 타이머 만료 코드 주석 수정

* UI: #69 label 태그 중첩 해결 및 input 태그 height 수정

* Feat: #63 마크다운 코드 블록 하이라이팅 기능 추가 (#86)

* Config: #63 ESLint 설정 추가 (no-cond-assign: off)

* Config: #63 @types/react-syntax-highlighter 추가

* Feat: #63 코드 블록 하이라이팅 기능 추가

* Fix: #63 인라인 코드와 코드 블록 분기 처리 수정

* Feat: #63 markdown 개행 처리를 위한 기능 추가

* Feat: #63 할일 등록 모달 DnD 파일 첨부 기능 추가 (#88)

* Rename: #63 userSettings → settings 파일 이름 변경

* Formatting: #63 파일 이름 변경에 따른 변수명 변경

* Config: #63 ESLint 환경 설정 추가

* Fix: #63 ESLint 설정에 포함된 공백문자 제거

* Feat: #63 할일 모달 파일 첨부 기능 추가

* UI: #63 삭제 버튼 색상 변경

* Feat: React Query 기본 환경 설정 & 상태별 프로젝트 일정 전체 조회 API 처리 추가 (#93)

* Config: #89 React Query Devtools 추가

* Feat: #89 React Query 기본 설정 추가

* Feat: #89 Mutation 기본 Error handler 추가

* Refactor: #89 Axios 에러 처리와 React Query 에러 처리 통합

* Feat: #89 Task 목록 useQuery 작성

* Chore: #89 Mock 데이터 수정 & Task, Status 타입 수정

* Chore: #89 Mock & Type 변경

* Feat: 할일 전체 목록 API MSW Handler 추가

* Chore: MSW Handler 추가로 할일 목록 Dummy 참조 삭제

* Chore: #94 프로젝트 상태, 프로젝트, 할일 타입 재정의 (#95)

* Chore: #94 TaskType의 color → colorCode로 변경

* Chore: #94 ProjectStatus Type의 order → sortOrder로 변경

* Chore: #94 TaskType의 order → sortOrder로 변경

* Chore: #94 ERD와 Swagger를 참고하여 타입 재정의

* Fix: #90 블록내 개행문자 삽입되는 문제 해결 (#96)

* Feat: #98 프로젝트 상태 목록 조회 API 기능 구현 (#99)

* Feat: #98 MSW 프로젝트 상태 목록 조회 API handler 추가

* UI: #98 로딩 UI 추가 (Spinner)

* Feat: 색상 추가 모달, 할일 등록 모달 상태 처리 로직 수정

* Feat: #98 프로젝트 상태 조회 네트워크 요청 로직 추가

* Feat: #101 프로젝트 상태 생성 API를 이용하여 상태 생성 기능 구현 (#103)

* Chore: #101 프로젝트 상태 타입 정의 수정

* Chore: #101 프로젝트 상태 타입 수정으로 인한 코드 수정

* Feat: #101 프로젝트 상태 생성 API를 위한 React Query 기능 추가

* Feat: #101 프로젝트 상태 생성 API MSW 기능 추가

* Feat: #101 프로젝트 상태 생성 기능 추가

* Chore: #101 불필요한 import 삭제

* Fix: #101 초기값 변수 이름 수정

* Feat: #102 프로젝트 상태 변경 API를 이용하여 상태 변경 기능 구현 (#106)

* Feat: #102 상태 변경 API를 위한 React Query 처리 추가

* Feat: #102 프로젝트 상태 변경 API MSW 처리 추가

* Feat: #102 프로젝트 상태 변경 기능 추가

* Fix: #102 상태 변경시 누락된 상태 순서 데이터 추가

* UI: #107 모달 레이아웃 UI 수정 (#108)

* UI: #107 모달 레이아웃 & 모달 버튼 컴포넌트 UI 수정

* UI: #107 프로젝트 상태 Form UI 수정

* Feat: #109 프로젝트 목록 조회 기능 구현 (#110)

* Feat: #109 프로젝트 목록 조회 API를 위한 React Query 처리 추가

* Feat: #109 프로젝트 목록 조회 API MSW 처리 추가

* Feat: #109 프로젝트 목록 사이드바 노출 기능 구현

* Feat: #109 네트워크 통신 대기시 Spinner UI 노출

* Chore: #109 Spinner UI 변경으로 다른 설정 코드 수정

* Feat: #80 로컬 로그인 기능 구현 (#100)

* Feat: #80 로그인 기능 초안 작성

* Test: #80 로그인 모킹 함수 작성

* Feat: #80 로그인 관리 저장소 로직 일부 수정

* Feat: #80 로그인 로직, 모킹 함수 일부 수정 및 요청 인터셉트 추가

* Feat: #80 axiosProvider에 응답 인터셉터 추가

* Feat: #80 access token 저장 위치 변경

- 기존 cookie에서 zustand store로 저장 위치 변경

* Chore: #80 불필요한 패키지 제거, 설치 및 유저아이디 변수명 변경

* Feat: #80 refresh token 갱신 모킹 함수 작성

* Feat: #80 refresh token 만료 시 에러 처리 구현

* Feat: #80 프로필 이미지 URL 해제 코드 적용

* Feat: #80 인터셉터 로직 일부 수정 및 로그인 API 호출 로직에 useMutation 훅 적용

* Feat: #80 모킹 함수에 토큰 발급 시간 관련 로직 추가

* Feat: #80 zustand authStore에서 persist 미들웨어 제거

* Feat: #80 로그인 코드 로직을 전체적으로 수정

* Refactor: #80 URL revoke를 위한 로직 변경 및 파일 경로 수정, 시간 상수 활용 코드 변경

* Feat: #80 로그인 API의 withCredentials 옵션 삭제, 토큰 발급 실패 시 에러 처리 방식 변경

* Feat: #80 로그인 API 호출 방식 변경

* Feat: #80 authStore에 AT 만료 시간 추가

* Feat: #80 authStore AT 자동 만료 기능 추가

* Fix: #80 Invalid hook call 에러 해결

* Formatting: #80 import 경로 정리

* Feat: #80 핸들러 타입 처리 및 이미지 컨테이너의 불필요한 revoke 코드 삭제

* Feat: #80 로그인 API 호출 시 useAxios 훅 적용

* Feat: #104 일정 순서 변경 API를 이용하여 칸반 보드 DnD로 일정의 순서를 변경하는 기능 구현 (#112)

* Formatting: #104 React Query 커스텀훅명 변경

* Feat: #104 일정 목록에 대해 더미 처리에서 커스텀훅 처리로 변경

* Feat: #104 일정 순서 변경 API를 위한 React Query 처리 추가

* Feat: #104 일정 순서 변경 API MSW 처리 추가

* Feat: #104 일정 순서 변경 기능 구현

* Chore: #104 updateStatus 함수 JSDoc 수정

* Feat: #105 상태 순서 변경 API를 이용하여 칸반 보드 DnD로 상태의 순서를 변경하는 기능 구현 (#113)

* Feat: #105 상태 순서 변경 API를 위한 React Query 처리 추가

* Feat: #105 상태 순서 변경 API MSW 처리 추가

* Feat: #105 상태 순서 변경 기능 구현

* Chore: #105 상대 경로를 절대 경로로 수정

* UI: #85 모든 프로젝트 및 팀 설정 페이지 UI 변경 (#97)

* UI: #85 모든 프로젝트 관리 페이지 style 및 팀 설정 페이지 style 통합

* UI: #85 팀 설정 페이지 팀 목록 리스트 색상 통일

* UI: #85 불 필요한 css 수정  및 라벨 색상 통일

* UI: #85 팀 설정 페이지 가입 및 대기 현황 없을시 UI 작업 및 불필요한 tailwind 수정

* Comment: #85 가입현황 대기현황 TODO 주석 작성

* UI: #85 팀 목록 조회 Query로 변경 및 컴포넌트 분리 및 타입 변경

* Chore: #85 콘솔로그 삭제

* Rename: #85 파일 이름 변경 및 경로 이동 (Page -> Layout)

* Comment: #85 router 주석 삭제

* Formatting: #85 querykey 이름 변경 및 콘솔 삭제

* Fix: #117 상태 추가 후 상태 순서 변경시 발생하는 에러 해결 (#119)

* Fix: #117 초기 상태값 의존성 문제 해결 & sortOrder 번호 수정

* Fix: #117 MockHash 데이터 최신화를 위한 로직 변경

* Feat: #111 액세스 토큰 갱신 기능 구현 (#116)

* Feat: #111 액세스 토큰 만료 시 리프레시 토큰을 이용해 AT 재발급 구현

* Comment: #111 필요없는 주석 및 콘솔 제거

* Fix: #122 칸반 보드 UI가 정해진 범위를 넘어가는 문제 해결 (#124)

* Fix: #122 칸반보드가 정해진 범위를 넘어가는 문제 해결

* Chore: #122 응답 데이터 sortOrder 순으로 정렬

* Feat: #114 일정 생성 API를 이용하여 일정 생성 기능 구현 (#125)

* Feat: #114 종료일 비활성화시 시작일을 따라가도록 변경

* Feat: #114 일정 생성 API React Query 처리 추가

* Feat: #114 일정 생성 API MSW 처리 추가

* Feat: #114 일정 생성 기능 구현

* Chore: #114 import 경로 수정 및 정리

* Feat: #118 로그인 후 유저 정보 호출 기능 구현 (#121)

* Feat: #118 유저 정보 가져오기 기능 구현 및 헤더에 유저 닉네임 적용

* Feat: #118 유저 정보 설정 페이지에 API 호출한 유저 데이터 적용

* Feat: #118 queryKey를 이용해 캐싱된 데이터를 사용하도록 코드 수정

* Formatting: #118 쿼리상태값 네이밍 변경

* Formatting: #118 로그인한 유저 조회 API 반환타입 변경

* Feat: #118 네트워크 코드 작성 방식 변경을 위한 useAxios 수정 및 로그인 코드 수정

* Feat: #118 로그인 네트워크 요청 방식 변경

* Feat: #118 유저 정보를 호출 후 zustand persist에 저장 기능 구현

* Feat: #118 zustand persist 로컬 스토리지에 암호화 적용

* Feat: #118 유저설정페이지, 헤더에 zustand 저장소의 유저 정보 적용

* Chore: #118 import 경로 정리

* Config: #118 config 파일에 stores 경로 추가

* Refactor: #118 프로필 이미지 이중관리 로직 제거

* Feat: #118 zustand 스토어에 slice pattern 적용

* Feat: #118 공식문서 기반 zustand slice pattern 적용

* Feat: #118 로그인 에러 공용처리

* Chore: #128 유저 정보 값 수정 (#129)

* Chore: #128 유저 프로필 이미지 관련 변수, 타입명, 초기값 관련 코드 수정

* Chore: #128 유저 정보 호출 시 userId, provider 정보를 포함하도록 타입 수정

* Chore: #128 useStore 내부 bio 속성의 초기값 변경

* UI: #89 일정 상세보기 모달 UI 작성 (#130)

* UI: #89 일정 상세보기 모달 UI 작업

* Feat: #89 일정 상세보기 정보 전달 방법 변경

* UI: #127 일정 등록 입력 양식들을 컴포넌트로 분리 (#131)

* UI: #127 프로젝트 상태 radio input 컴포넌트 분리

* UI: #127 시작일, 종료일 컴포넌트 분리

* UI: #127 마크다운 컴포넌트 분리

* UI: #127 파일 DropZone 컴포넌트 분리

* UI: #127 마크다운 컴포넌트 props 변경

* UI: #127 시작일, 종료일 컴포넌트 props 변경

* UI: #127 프로젝트 상태 컴포넌트 props 변경

* UI: #127 시작일, 종료일 컴포넌트 props 변경

* UI: #127 마크다운 컴포넌트 props 변경

* UI: #127 일정 등록 입력 양식중 수행자 검색, 선택 목록 컴포넌트 분리 (#132)

* UI: #127 수행자 검색 UI 컴포넌트 분리

* UI: #127 수행자 목록 UI 컴포넌트 분리

* Feat: #134 일정 수행자 조회 기능 추가 (#136)

* Feat: #134 수행자 타입 수정

* Chore: #134 수행자 타입 수정에 따른 mock 데이터 수정

* Feat: #134 일정 생성 API 수정 사항 반영

* Feat: #134 일정 수행자 목록 API React Query 처리 추가

* Feat: #134 일정 수행자 목록 조회 API MSW 처리 추가

* Feat: #134 일정 상세 모달 수행자 목록 조회 기능 추가

* Feat: 수행자 타입 추가

* Feat: #123 로그아웃 기능 구현 (#133)

* Feat: #123 로그아웃 흐름 작성

* Feat: #123 로그아웃 네트워크 로직 작성 및 커스텀 훅 작성

* Feat: #123 토스트 메시지 표시를 위한 시간 지연 추가

* Feat: #123 로그아웃 시 유저 store 정보 초기화 기능 구현

* Feat: #123 RT 만료 시 후처리 구현

* Feat: #123 axiosProvider에 useNavigate를 사용할 수 있도록 수정

* Chore: #123 MainRouter import 경로 수정

* Comment: #123 Interceptor 컴포넌트 적용 방식 관련 ToDo 주석 추가

* Comment: #123 주석 오타 수정

* Feat: #135 일정 파일 목록 조회 기능 추가 (#138)

* Feat: #135 Task 타입 수정 (files 삭제)

* Chore: #135 Task 타입 수정에 따른 mock 데이터 수정

* Feat: #135 일정 파일 목록 조회 API React Query 처리 추가

* Feat: #135 일정 파일 목록 조회 MSW 처리 추가

* Feat: #135 일정 상세 모달 파일 목록 조회 기능 추가

* Feat: #135 일정 파일(TaskFile) 타입 정의

* Feat: #140 마크다운 커스텀 a태그 속성 수정 (#141)

* Feat: #140 마크다운 커스텀 a태그 속성 수정

* Feat: #140 aria-label 속성 추가

* Feat: #120 팀 설정 페이지 탈퇴 삭제 및 수락 거부 기능 구현 (#126)

* Feat: #120 팀 탈퇴하기 로직 구현

* Feat: #120 팀 삭제하기 기능 추가 및 탈퇴하기 Handler 수정

* Feat: #120 초대 수락 및 거부 기능 추가

* Feat: #120 msw Handler 수정 및 타입 수정 주석 삭제

* Comment: #120 js doc 설명 추가

* Fix: #120 팀 탈퇴 API 및 삭제 API 수정

* Fix: #120 userId 목 데이터 토큰으로 변경

* Fix: #120 userId 전역에서 독립 실행으로 변경

* Fix: #120 팀 삭제 API  일정 파일 &  유저 삭제 추가 및 팀 탈퇴API 수정

* Comment: #120 TODO 주석 추가

* Feat: #137 아이디/비밀번호 찾기 기능 구현 (#139)

* UI: #137 아이디 찾기 Form UI 수정 및 결과 화면 UI 작성

* UI: #137 비밀번호 찾기 Form UI 수정 및 결과 화면 UI 작성

* Formatting: #137 validation에 맞게 아이디 비밀번호 임시값 변경

* Feat: #137 유저아이디 찾기 네트워크 로직 구현

* UI: #137 auth 관련 폼 UI 배치 및 margin, padding 수정

* Feat: #137 유저 비밀번호 찾기 네트워크 로직 구현

* Chore: #137 id/pw 찾기 결과 부분 태그 수정

* Formatting: #137 결과화면 시맨틱 태그 수정

* Feat: #137 아이디 길이에 따른 아이디 보안 처리

* UI: #137 아이디찾기 input 라벨을 placeholder로 변경

* Feat: #137 폼 전송 이전에 이메일 인증 코드 확인 로직 추가

* UI: #137 AuthLayout 패딩 및 간격 수정

* Refactor: #137 ID/PW 찾기 페이지의 결과 화면, 폼을 컴포넌트로 분리

* Chore: #137 MSW 핸들러의 응답 성공 실패 구현 순서 변경

* Refactor: #137 ID 보안 관련 컨버터 함수 리팩토링

* Feat: #144 비밀번호 변경 기능 구현 (#145)

* Feat: #144 비밀번호 변경 네트워크 로직 구현

* Feat: #144 비밀번호 변경 후처리 구현

* Chore: #144 불필요한 데이터 출력 코드 삭제

* Comment: #144 필요한 주석 추가

* Refactor: #144 동일한 신규 비밀번호 입력 시 Validation 작성

* Feat: #142 이메일 인증 기능 구현 (#143)

* Chore: #142 useNavigate 변수명 변경 및 useFormContext 타입 추가

* Feat: #142 이메일 인증번호 요청 네트워크 로직 작성 및 기존 인증 처리 로직 수정

* Feat: #142 이메일 인증코드 발급 관련 코드를 더미데이터로 대체

* Refactor: #142 상위 컴포넌트에서 이메일 인증 관련 코드를 관리하도록 수정

* Refactor: #142 인증번호 불일치시 후처리 함수 분리

* Feat: #142 인증번호 불일치 시 필드에러만 표시하도록 수정

* Refactor: #142 SearchDataForm로 전달할 데이터를 객체로 묶어 전달하도록 수정

* UI: 파일 드래그 앤 드롭시 영역 스타일 가시성 스타일 추가 (#151)

* Feat: #115 일정 생성 Form 타입 정의 수정 및 추가

* Chore: #115 일정 Form 타입 변경으로 인한 관련 코드 수정

* UI: #115 파일 드래그 앤 드롭시 영역 스타일 가시성 스타일 추가

* UI: #115 스크린 리더와 접근성 개선을 위한 속성 추가

* Feat: #147 수행자 검색 API 변경으로 인한 수행자 검색 기능 수정 (#152)

* Refactor: #147 수행자 검색 결과 타입 수정

* Refactor: #147 프로젝트에 속한 유저 검색 API MSW 처리 수정

* Feat: #147 프로젝트 팀원 목록 조회 React Query 처리 추가

* Feat: #147 프로젝트 팀원 목록 조회 API MSW 기능 추가

* Feat: Project Context에 프로젝트 팀원 정보 추가

* Feat: #147 프로젝트 팀원 목록과 수행자 목록 매칭하여 UI 정보 표시

* Feat: #147 프로젝트 팀원 목록과 수행자 목록 매칭하여 UI 정보 표시

* Feat: #147 매칭되는 유저 정보가 없을 시 에외처리 추가

* Refactor: #153 유저 검색을 위한 SearchUserInput 컴포넌트 리팩토링 (#154)

* Refactor: #153 전체 유저 검색 & 팀 유저 검색 axios 로직 수정

* Refactor: #153 SearchUserInput 컴포넌트 디바운스, Abort 로직 추가

* Refactor: #153 callback type 분리

* Rename: #153 파일 typo 수정

* Feat: #153 Exhaustive Check 기능 추가

* Feat: 일정 수정 모달 UI 변경 사항 반영 (#155)

* Refactor: #148 파일 타입 & 일정 타입 추가 및 수정

* Remove: #148 Assignee 타입 삭제 UserWithRole 타입으로 대체

* Chore: #148 타입 재정의에 따른 코드 수정

* Feat: #148 일정 모달 수정과 컴포넌트를 공유하기 위한 수정

* Feat: #148 특정 일정을 탐색하는 기능 추가

* UI: #148 일정 수정 모달 UI 수정

* Chore: #148 import 정리, ToDo 정리

* Refactor: #148 불필요한 연산 제거

* Feat: #149 일정 수정 모달 수행자 추가 기능 구현 (#157)

* Feat: #149 수행자 추가 API를 위한 React Query 기능 추가

* Feat: #149 수행자 추가 API MSW 처리 추가

* Feat: #149 수행자 추가 기능 구현

* Fix: #149 이미 할당된 수행자인지 확인하는 MSW 로직 추가

* Chore: #149 MSW 변수 오타 수정

* Feat: #150 일정 수정 모달 수행자 삭제 기능 구현 (#158)

* Feat: #150 수행자 삭제 API를 위한 React Query 처리 추가

* Feat: #150 수행자 삭제 API를 위한 MSW 처리 추가

* Feat: #150 수행자 삭제 기능 구현

* Refactor: #150 수행자 삭제 로직 개선

* Feat: #156 일정 수정 모달 일정 정보 변경 기능 구현 (#160)

* Feat: #156 일정 정보 수정 API를 위한 React Query 기능 추가

* Feat: #156 일정 정보 수정 API를 위한 MSW 기능 추가

* Feat: #156 일정 정보 수정 기능 구현

* Fix: #163 일정 수정 모달에서 상태 선택 정보가 사라지는 문제 해결 (#164)

* Fix: #163 타입 호환을 위한 새로운 타입 정의 (TaskUpdateForm)

* Fix: #163 TaskUpdateForm 추가로 인한 타입 정보 처리 수정

* Feat: #146 비밀번호 변경 전 인증 페이지의 인증 로직 구현 (#162)

* Feat: #146 이메일 인증여부 확인 후 비밀번호 변경 페이지를 이메일 인증 페이지로 리다이렉트 기능 구현

* Feat: #146 이메일 인증 성공 후 비밀번호 페이지로 변경 기능 구현

* Formatting: #146 이메일 인증 코드 변수명 및 타입명 변경

* Fix: #146 인증번호 에러 발생 시 리프레시 토큰발급 요청이 무한히 이루어지는 버그 수정

* Fix: #146 authAxios 사용 시 401 응답코드를 받았을 때 강제 로그아웃처리되는 오류 수정

* Formatting: #146 이메일 인증 코드 변수명 및 Validation Rule 이름 변경

* Chore: #146 코드리뷰에 따라 불필요한 코드 삭제 및 에러처리 추가

* Chore: #146 불필요한 코드 삭제

* Comment: #146 이메일 인증 페이지로 리다이렉션하는 코드 주석 처리

* Feat: #115 일정 등록 모달의 파일 업로드 기능 구현 (#166)

* Feat: #115 파일 업로드 API를 위한 React Query 처리 추가

* Feat: #115 일정 파일 업로드 API를 위한 MSW 처리 추가

* Feat: #115 파일 Validation 추가

* Feat: #115 파일 업로드 기능 구현 (병렬 처리)

* Chore: #115 허용하는 파일 확장자 constants로 정리

* Feat: #115 FileDropZone accept props 추가

* Feat: #115 Task Form 관련 타입 수정 및 추가

* Feat: #115 일정 파일 업로드 Validation 추가

* Chore: #115 더미 파일 설정 추가

* Chore: #115 CreateModalTask 컴포넌트 import 경로 수정

* Chore: 파일 validation warn message 수정

* Fix: #115 파일 최대 개수 Validation 수정

* Fix: #115 파일 최대 개수 Validation 수정

* Feat: #115 병렬 처리된 파일의 성공과 실패 목록 메세지 노출

* Feat: #115 파일 업로드 성공은 묶어서, 실패는 개별 메세지 노출로 변경

* Feat: #115 FileDropZone 컴포넌트 props 변경에 따른 코드 수정

* Feat: #115 파일 Validation 예외 처리 추가

* Chore: #115 일정 파일 accept 설정 상수로 추출

* Refactor: #173 React Query의 Query Key 정리 (#174)

* Refactor: #173 React Query의 Query Key 정리

* Fix: #173 TaskFile Query Key 수정

* Feat: #167 일정 수정 모달의 일정 파일 삭제 기능 구현 (#176)

* Feat: #167 일정 파일 삭제 API를 위한 React Query 기능 추가

* Feat: #167 일정 파일 삭제 API를 위한 MSW 처리 추가

* Feat: #167 일정 파일 삭제 기능 구현

* Feat: #167 일정 수정 모달에서 각 양식별로 Spinner가 생기도록 수정

* Fix: #167 조건문에 지정한 변수 수정 (taskFileIndex → fileIndex)

* Feat: #170 일정 삭제 기능 구현 (#177)

* Feat: #170 일정 삭제 API를 위한 React Query 기능 추가

* Feat: #170 일정 삭제 API를 위한 MSW 처리 추가

* Config: #170 Tailwind Delete용 색상 추가

* Feat: #170 모달용 공용 버튼 컴포넌트 추가 (ModalButton)

* Feat: #170 일정 삭제 기능 구현

* UI: #170 버튼 hover 스타일 추가

* Feat: #170 일정 삭제 이후 캐시 처리 옵션 추가

* Fix: #170 삭제 로직 조건문 수정

* Feat: #170 일정 삭제 성공시 쿼리 데이터 무효화 및 삭제 옵션 수정

* Chore: #170 import 경로 수정

* Feat: #159 닉네임 중복 확인 API 및 회원가입 기능 구현 (#171)

* UI: #159 회원가입 페이지에서 프로필 이미지 항목 제외 및 폼 내부 요소 수직 중앙정렬

* Feat: #159 닉네임 중복 체크 기능 구현

* Feat: #159 회원가입 기능 구현

* Feat: #159 중복 확인 후 닉네임 버튼 비활성화 기능과 중복 확인 후 재입력시 버튼 활성화 기능 구현

* Feat: #159 중복 확인 후 닉네임 버튼 비활성화 기능과 중복 확인 후 재입력시 버튼 활성화 기능 구현

* Feat: #159 회원가입 기능 구현을 위한 user mock 데이터 추가 및 mock JWT 생성, 디코딩 기능 구현

* Chore: #159 Validation Rule 에 맞추어 mock 데이터의 비밀번호 수정

* Fix: #159 새로고침 시 기본 더미 JWT 데이터로도 기능이 동작되도록 수정

* Fix: #159 액세스 토큰 재발급이 안 되는 오류 해결

* Feat: #159 회원가입 시 기존에 존재하는 이메일을 입력했을 시 에러 처리

* Chore: #159 코드 리뷰 반영 수정

* Chore: #159 User Dummy의 소셜 회원 username, nickname 값 수정

* Chore: #159 mock 데이터의 유저 정보 수정

* Fix: #159 로그인 시 리프레시 토큰의 만료 시간을 초기화하도록 수정

* UI: #178 ModalFormButton 제거 및 ModalButton으로 대체 (#179)

* Feat: #169 상태 삭제 기능 구현 (#180)

* Feat: #169 상태 삭제 API를 위한 React Query 기능 추가

* Feat: #169 상태 삭제 API를 위한 MSW 기능 추가

* Feat: #169 상태 삭제 기능 구현

* Config: #169 react query client 설정 추가

* Feat: #169 예외 처리 로직 추가 & 로딩 시 화면 추가

* Chore: #169 메세지 오탈자/맞춤법 수정

* Feat: #87 팀 생성 UI 및 로직 추가 (#161)

* Feat: #87 팀 생성 UI 및 로직 추가

* Fix: #87 msw handler 하드코딩 수정 및 유효하지 않은 역활 처리

* Refactor: #87 팀 권한 정보 툴팁 component 분리 및 경로 정리

* Fix: #87 코드리뷰 수정사항 반영

* Fix : SelectedUserWithRole 타입 제네릭으로 변경

* Refactor: #87 코드리뷰 반영 리팩토링

* Fix: #182 칸반 보드에서 일정 삭제 / 상태 삭제 후 순서 변경이 제대로 일어나지 않는 문제 해결 (#184)

* Fix: 일정 삭제 & 상태 삭제시 sortOrder를 재정렬하도록 수정

* Fix: #182 일정 삭제 & 상태 삭제시 sortOrder를 재정렬하도록 수정

* Formatting: #183 파일 목록 조회 데이터 구조 변경 (#185)

* Feat: #175 유저 프로필 변경 페이지 기능 구현 (#181)

* UI: #175 유저설정 페이지 링크 분리 UI 변경

* Feat: #175 유저 프로필 변경 기능 구현

* Feat: #175 유저 프로필 변경 시 닉네임 중복 체크 기능 추가

* Refactor: #175 닉네임 중복체크 훅 분리

* Refactor: #175 기존 닉네임 트래킹 변수를 커스텀 훅으로 이동

* Feat: #175 userIndex를 찾지 못한 경우 에러 추가

* Fix: #175 최대 등록 가능한 링크의 개수를 5개로 수정

* Feat: #175 유저 프로필 변경 네트워크 로직을 tanstack query 로직으로 수정

* Refactor: #175 queryKeyGenergator를 이용해 쿼리 키 생성 및 적용

* Formatting: #175 통일성을 위해 변수명 수정

* Chore: #175 유저데이터 초기값 설정에서 optional chaining 제거

* Feat: #168 일정 파일 다운로드 기능 구현 (#186)

* Chore: #168 파일 더미 데이터 수정

* Feat: #168 일정 파일 다운로드 API 요청 기능 구현

* Feat: #168 일정 파일 다운로드 API MSW 기능 추가

* Feat: #168 useAxios 즉각적인 처리를 위해 response 반환 추가

* Feat: #168 일정 파일 다운로드 기능 구현

* Feat: #168  풀파일명을 파일명, 확장자로 분리하는 유틸리티 함수 추가

* Chore: #168 import 경로 수정

* Feat: #187 일정 수정 모달 파일 업로드 기능 추가 (#189)

* Refactor: #187 FileDropZone 컴포넌트 리팩토링

* Feat: #187 useTaskFile 커스텀훅 추가

* Feat: #187 일정 수정 모달 파일 업로드 기능 구현

* Comment: #187 불필요한 주석 제거

* Rename: #187 파일 이름 오타 수정

* Chore: #187 코드 순서 변경

* Feat: #188 일정 상세 모달 수정 버튼 기능 구현 (상세 모달 → 수정 모달 전환) (#190)

* Feat: #188 상세 모달 컴포넌트 props로 수정 모달 open 함수 주입

* Feat: #188 칸반 보드 상세모달 수정 버튼 클릭시 수정 모달 전환

* Feat: #188 캘린더 일정 수정 모달 수정 버튼 클릭시 수정 모달 전환

* Chore: #188 import 경로 수정

* Feat: #172 소셜 회원가입/로그인 기능 구현 (#191)

* Feat: #172 카카오 로그인 AT 발급 기능 구현

* Feat: #172 카카오 회원가입 및 로그인 구현

* Feat: #172 구글 회원가입 및 로그인 구현

* Refactor: #172 콜백페이지를 카카오-구글이 공용으로 쓸 수 있도록 수정 및 컴포넌트, 함수명 수정

* Refactor: #172 공급업체별 service 함수 및 네트워크 모킹 핸들러 통합

* Refactor: #172 공급업체별 소셜로그인 버튼 컴포넌트 통합

* Feat: #172 인가코드 얻어오지 못했을 시 에러 처리 추가

* Fix: #172 콜백 페이지의 다중 호출 방지 기능 추가

* Refactor: #172 코드리뷰 반영 수정

* Chore: #172 카카오구글 링크 env 파일로 이동 및 코드 리뷰 반영 수정

* Feat: #198 API 명세서의 응답 데이터 구조 변경에 따른 타입 재정의 (#201)

* Refactor: #198 일정 타입 수정 (name → taskName)

* Refactor: #198 프로젝트 타입 수정 (name → projectName)

* Comment: #198 완료한 ToDo 주석 제거

* Chore: #198 Label ID 수정

* Fix: #202 Calendar 컴포넌트 events 타입 호환 문제 해결 (#203)

* Feat: #165 팀 수정 모달 UI 및 기능 구현 (#195)

* Feat: #87 팀 생성 UI 및 로직 추가

* Fix: #87 msw handler 하드코딩 수정 및 유효하지 않은 역활 처리

* Refactor: #87 팀 권한 정보 툴팁 component 분리 및 경로 정리

* Fix: #87 코드리뷰 수정사항 반영

* Feat: 팀 수정 API 및 query 추가

* Feat: #165 팀 정보 수정 모달 UI 및 기능 구현

* Fix: #165 팀원 목록 조회 수정

* Remove: #165 필요없는 파일 삭제

* Fix: #165 코드리뷰 반영 수정

* Fix: #165 중복 Generator 쿼리 키 제거

* Fix: #165 코드리뷰 반영 수정

* Fix: #165 팀원 삭제 MSW 수정 및 팀원 삭제 팀 삭제 query 수정

* Fix: #165 TeamCoworkerForm 타입 정의

* Fix: #165 팀 타입 재정의 & Indexed Access type 으로 수정

* Feat: #204 일정 수정 모달에서 일정 상세 모달로 돌아가기 버튼 추가 (#205)

* Feat: #204 일정 정보 수정후 모달을 닫는 기능 제거

* Feat: ModalButton의 버튼 text 색상 props로 전환

* Feat: #204 일정 상세보기 모달 props 변경, 단일 일정 검색 추가

* Refactor: #204 캘린더 일정 hover시 가시성 개선

* Refactor: #204 QueryFilter 옵션 수정을 통한 refetch 요청 최소화

* Feat: #204 일정 목록 로딩시 대체 UI(Spinner)가 나오도록 수정

* Comment: #204 React Reparenting 문제 주석 추가

* Fix: #204 useEffect 의존성 추가

* UI: #204 돌아가기 버튼 margin 간격 조정

* UI: #206 일정 파일 다운로드 버튼 태그 구성 변경 (#207)

* UI: #206 일정 파일 다운로드 버튼 태그 구성 변경 & 스타일 변경

* UI: #206 드래그 선택 불가능 하도록 select-none 추가

* Feat: #208 PeriodDateInput 컴포넌트 종료일 토글 자동 활성화 기능 추가 (#209)

* Fix: #208 날짜 관련 Validation 로직 수정

* Feat: #208 프로젝트 목록 데이터 타입 변환 추가

* Feat: #208 PeriodDateInput 컴포넌트 종료일 토글 자동 활성화 기능 추가

* Chore: #208 PeriodDateInput Import 정리

* Chore: #208 오타 수정 (projctStartDate → projectStartDate)

* Refactor: #208 시작일과 종료일 날짜 처리 과정 수정

* Fix: #214 프로젝트 목록 및 팀 목록 쿼리로 변경 (#215)

* Fix: #214 프로젝트 및 팀 목록 더미에서 쿼리로 변경

* Fix: #214 AI 코드리뷰 반영

* Feat: #192 링크 수정 기능 구현 (#193)

* Feat: #192 링크 변경 기능 구현

* UI: #192 링크 수정 네트워크 처리 중 로딩 추가

* Comment: #192 삭제된 주석 추가

* Refactor: #192 코드리뷰 반영 수정

* Chore: #192 코드리뷰 반영 수정

* Feat: #192 로그아웃 시 유저 링크 데이터 초기화를 위해 쿼리키에 유저 ID 등록

* Refactor: #172 이중 관리 방지를 위한 전체 링크 변수 삭제

* Feat: #210 프로젝트 삭제 기능 추가 (#213)

* Feat: #210 프로젝트 삭제 기능 추가

* Fix: #210 프로젝트 삭제 handler 변경 및 useEffect 의존성 배열 변경

* Fix: #210 코드리뷰 반영 수정 및 경로 정리

* Formatting:#210 isLoading 이름 변경

* Fix:#216 home 페이지로 이동시 teams 페이지로 리다이렉션 (#217)

* Refactor: #196 MSW중 TaskService 관련 기능 리팩토링 (#219)

* Refactor: #196 MSW Task 처리 관련 리팩토링

* Comment: #196 불필요한 console.log 삭제

* Feat: #196 더미 토큰 처리에서 실제 토큰 처리로 수정

* Feat: #196 Mock에 정의한 타입 분리

* Commnet: #196 MockAPI 함수 기능 설명 주석 추가

* Chore: #196 타입 형변환 로직 삭제

* Feat: #196 MSW 처리시 Auto Increment를 모방하여 ID 생성

* Chore: #196 import 경로 정리

* Fix: #220 종료일 비활성화시 종료일 설정 기능도 비활성화 되도록 수정 (#221)

* UI:#199 프로젝트 생성 UI 구현 (#218)

* UI:#199 프로젝트 생성 UI 구현

* Fix:#199 role.ts 파일의 프로젝트 룰 권한 이름 변경

* Fix: #222 인증여부에 따라 헤더의 문구와 로그아웃 버튼 노출하도록 수정 (#223)

* Fix: #222 인증여부에 따라 헤더의 문구와 로그아웃 버튼 노출하도록 수정

* Feat: #222 유저인증 되어 있지 않을 시 로그인 버튼 추가

* Chore: #222 로그인 화면 이동 시 replace 제거

* Refactor: #224 MSW 처리중 StatusService, ProjectService 기능 리팩토링 (#226)

* Refactor: #224 MSW StatusService 기능 리팩토링

* Formatting: #224 일정 수정 API 로직중 폼 데이터 변수명 수정

* Refactor: #224 MSW ProjectSevice 기능 리팩토링

* Fix: #224 프로젝트 관련 정보 조회성 로직은 팀에 속하는가로 수정

* Fix: #224 팀 접근 권한에 넘기는 매개변수 수정

* Fix: #224 AI 리뷰 반영

* Feat: #211 유저 프로필 이미지 업로드 기능 구현 (#212)

* Feat: #211 유저 프로필 이미지 업로드 기능 구현

* Feat: #211 DB 명세서에 따라 프로필 사진 저장 방식 변경

* Feat: #211 유저 프로필 이미지 저장 형식을 UUID로 변경

* Chore: #211 코드리뷰 반영 수정

* Chore: #211 코드리뷰 반영 수정

* Chore: #211 토큰에서 유저 정보를 추출할 수 없을 때 오류 추가

* Feat: #211 이미지 업로드 시 서버 측에서 UUID를 가져와 zustand 스토어에 저장하도록 수정

* Feat: #228 유저 인증을 위한 MSW 수정 및 페이지 라우트 인증 처리 (#229)

* Feat: #228 로그인 전후 라우트별 인증 확인 처리

* Chore: #228 MSW에서 JWT 더미 데이터 사용한 코드 일괄 삭제

* Fix: #228 새로고침 시 로그인 페이지로 강제 다이렉트되는 문제 해결

* Chore: #236 MSW에서 mock JWT 삭제 및 헤더의 로그아웃 버튼 노출 시 userId 체크 추가 (#237)

* Fix:#225 팀 쿼리 키 userId 추가 및 프로젝트 목록 조회 teamId null시 처리 추가 (#227)

* Fix:#225 team query key add userId & teamId null append

* Fix: #225 인덱스트 엑세스 타입 교체 및 업데이트모달페이지 오류 수정

* Fix: #225 enabled 다시 추가 및 테스트 로직 삭제

* Feat: #194 유저 프로필 이미지 조회 기능 구현 (#235)

* Feat: #211 유저 프로필 이미지 업로드 기능 구현

* Feat: #211 DB 명세서에 따라 프로필 사진 저장 방식 변경

* Feat: #211 유저 프로필 이미지 저장 형식을 UUID로 변경

* Chore: #211 코드리뷰 반영 수정

* Chore: #211 코드리뷰 반영 수정

* Chore: #211 토큰에서 유저 정보를 추출할 수 없을 때 오류 추가

* Feat: #211 이미지 업로드 시 서버 측에서 UUID를 가져와 zustand 스토어에 저장하도록 수정

* Feat: #194 프로필 이미지 조회 기능 구현

* Chore: #194 파일 경로 수정

* Chore: #194 불필요한 쿼리 함수 삭제

* Chore: #194 msw에서 더미 jwt 코드 삭제 및 접근권한 에러 코드 변경

* Feat: #200 프로젝트 생성 (#240)

* UI: #200 프로젝트 팀 없이 생성 시  토스트 메시지 출력 및 프로젝트 생성 UI 설정

* Feat: #200 프로젝트 생성시 날짜 선택 로직 추가

* Feat: #200 프로젝트 생성 팀원 검색 로직 추가

* Feat: #200 프로젝트 생성 로직 추가

* Fix: #200 ai 코드리뷰 반영 수정

* Fix: #200 코드리뷰 반영 수정

* Fix: #238 일정 등록 전 프로젝트 상태 개수 확인하도록 수정 (#239)

* Refactor: #243 전체 일정 조회에서 단일 일정 조회 로직 분리 (#244)

* Refactor: #243 전체 일정 조회에서 단일 일정 조회 로직 분리

* Refactor: #243 전체 일정 조회에서 일정 이름 목록 추출 로직을 분리

* Chore: #243 AI 코드 리뷰 반영

* UI: #241 프로젝트 수정 UI 구현 (#242)

* UI: #241 프로젝트 수정 UI 구현

* Fix: #241 경로 정리 & 폼 아이디 & spinner 조건 수정

* Fix: #241 경로 정리 및 프로젝트 생성 네이밍 변경

* Fix: #241 프로젝트 & 팀 이름 중복체크 및 팀 쿼리 변경

* Formatting: #241 teamList 변수 제거 후 data 별칭으로 수정

* Refactor: #248 전체 상태 조회에서 단일 상태 조회 로직 분리 (#249)

* Refactor: #248 전체 상태 조회에서 단일 상태 조회 로직 분리

* Comment: #248 수정한 ToDo 주석 삭제

* Chore: #248 AI 리뷰 내용 반영

* Chore:# 248 import 경로 정리

* Feat: #246 프로젝트 수정 기능 구현 (#250)

* Feat: #246 프로젝트 수정 기능 구현

* Fix: #246 mutate 별칭 네이밍 통일 및 msw 수정

* Fix: #245 accesstoken 더미 데이터를 유저 데이터로 수정 (#247)

* Fix: #245 accesstoken 더미 데이터 부분 수정

* Fix: #245 유저 인증 토큰 상태 코드 통일

* Chore: #231 이메일 인증 관련 코드 검토 및 주석 제거 (#234)

* Config: #254 테스트를 위한 환경 설정 추가 (#255)

* Chore: #254 build 작업시 tsc에서 지적하는 내용 수정

* Config: #254 staging 로컬 환경 테스트를 위한 serve 라이브러리 추가

* Config: #254 build를 위한 tsc 설정 추가

* Config: #254 gitignore 설정 추가

* Feat: #251 프로젝트 수정 팀원 추가 및 권한 변경 추가 (#252)

* Feat: #251 프로젝트 수정 팀원 추가 및 권한 변경 추가

* Fix: AI 코드리뷰 반영 코드 수정

* Fix: #251 코드리뷰 반영 수정

* Fix: #251 프로젝트 수정 msw 및 mock API 수정

* Fix: #251 mockAPI 수정 및 mswHandler 수정

* Fix: #251 type 중복 삭제 mockAPI return 삭제 mswHandler try-catch 추가

* Formatting: #251 필요없는 경로 삭제

* Feat: #253 프로젝트 팀원 삭제 추가 (#256)

* Feat: #253 프로젝트 팀원 삭제 추가

* Fix: #253 프로젝트 팀원 삭제 핸들러 삭제 범위 추가

* Fix: #253 mockAPI 추가 및 프로젝트 팀원 삭제 mswhandler 수정

* Config: #258 스테이징 환경에 https 설정 적용 (#259)

* Config: #258 localhost 인증서 설정을 통해 실행하도록 script 명령어 수정

* Config: #258 localhost 인증서 파일 추적 제외 설정

* Formatting: #257 권한 설명 변경 (#260)

* Formatting: #257 권한 설명 변경

* Formatting: #257 팀 & 프로젝트 권한 설명 변경

* Formatting: #257 프로젝트 룰 권한 설명 변경

* Formatting: #257 권한 설명 변경

* Fix: #233 새로고침 시 zustand 스토어 초기화되는 문제 수정 (#263)

* Fix: 새로고침 후 isAuthenticated 초기화 문제를 해결하기 위한 영속성 추가

* Fix: 새로고침 시 zustand 스토어의 AT가 휘발되는 현상 보완

* Fix: #233 이미지 삭제 시, 기등록된 이미지가 아닌 다른 이미지를 참조 삭제하고 있던 에러 수정

* Chore: #233 gitignore 중복 삭제

* Feat: #261 유저 전체 검색 mswHandler 추가 & 팀 생성 시 HEAD 권한 삭제 (#264)

* Feat: #261 유저 전체 검색 mswHandler 추가 & 팀 생성 시 HEAD 권한 삭제

* Fix: #261 유저 전체검색 mswHandler 변경

* Config: #269 Github Actions를 통해 테스트 통과 여부 검사 설정 (#271)

* Config: #269 vitest github actions workflow 추가

* Config: #269 package.json scripts 명령어 세분화

* Fix: #266 AT 기간 만료 시 로직 수정 (#267)

* Feat: #197 메타 데이터를 설정하는 컴포넌트 추가 및 적용 (#273)

* Config: reat-helmet-async 라이브러리 추가

* Remove: #197 .gitkeep 파일 삭제

* Config: #197 favicon 아이콘 설정

* Feat: MetaData 추가를 위한 컴포넌트 추가

* Feat: #197 Page 컴포넌트에 Meta 컴포넌트 적용

* Chore: #197 메타 데이터 title 일관성을 위한 수정

* Chore: #197 접근성 개선을 위한 수정

* Asset: #197 Open Graph용 이미지 추가 및 og:image 재설정

* Config: #197 환경변수명 변경 및 Meta 컴포넌트 적용

* Chore: #197 불필요한 로그 삭제

* Fix: #274 팀 가입 현황과 대기 현황 필터링이 반대로 설정된 문제 해결 (#277)

* Fix: #274 가입현황 대기현황 팀목록 필터링 수정

* Fix: #274 필터링 조건 변경에 따른 mock 데이터 수정

* Fix: #274 필터링 값 변경에 따른 팀 초대 수락 MSW 처리 수정

* Fix: #274 팀 생성 및 팀원 초대 MSW 처리 수정

* Fix: #275 로그아웃시 Access Token이 포함되도록 수정 (#276)

* Fix: #275 로그아웃시 Access Token이 포함되도록 수정

* Fix: #275 MSW 로그아웃 처리 수정

* Feat: #230 유저 프로필 이미지 삭제 기능 구현 (#272)

* Feat: #230 프로필 이미지 삭제 기능 구현

* Feat: #230 query 실행 결과에 따른 후처리를 위해 mutateAsync 사용

* Feat: #230 유저 mock 데이터에서 프로필 이미지 삭제

* Chore: #230 URL 분리에 따른 변수명 변경

* Chore: #230 mutate 명칭을 명시적으로 변경

* Feat: #265 프로젝트 생성 및 수정 권한 설정 추가 (#268)

* Feat: 프로젝트 생성 및 수정 권한 설정 추가

* Feat: #265 프로젝트 수정 및 삭제 권한 설정 및 컴포넌트 분리

* Fix: #265 경로 정리 및 팀원 목록 조회 타입 단언 삭제

* Config: #270 Github Actions 자동 배포 설정 추가 (#280)

* Config: #285 소셜 로그인 리다이렉트 URL 설정 & checkout 브랜치 명시 (#286)

* Fix: #288 환경변수명 수정 (#289)

---------

Co-authored-by: Yoonyesol <[email protected]>
Co-authored-by: ice-bear98 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐞 Bug 버그가 발생했어요 💉 Fix 에러 혹은 버그를 수정했어요
Projects
None yet
Development

Successfully merging this pull request may close these issues.

새로고침 시 zustand 스토어 초기화되는 문제 수정
2 participants